package com.lmy.springboot.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Arrays;

/**
 * 整合DruidDatasource到springboot，有两种方式
 * 方式1：自定义方式，在配置类中使用@Bean标注方法注入相关Bean
 * 方式2：引入starter方式
 */
@Configuration
public class DruidDataSourceConfig {

//    /**
//     * 编写方法，注入druidDataSource
//     * 1.使用@ConfigurationProperties读取application.yaml中datasource相关属性(url,username,password,driver)到注入的对象中
//     * 2.为什么配置了自定义的数据源，springboot默认的HikariDataSource就失效了？
//     *   因为在DataSourceAutoConfiguration中，注解标识了当容器中没有DataSource类型的Bean时，才会注入默认的HikariDataSource
//     *   @ConditionalOnMissingBean({DataSource.class, XADataSource.class}) 表示当容器中有注入DataSource类型Bean时，就不会注入HikariDataSource
//     *   源码：
//     *   @Conditional({PooledDataSourceCondition.class})
//     *     @ConditionalOnMissingBean({DataSource.class, XADataSource.class})
//     *     @Import({DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class, DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class, DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class})
//     *     protected static class PooledDataSourceConfiguration {
//     *         protected PooledDataSourceConfiguration() {
//     *         }
//     *     }
//     * @return
//     */
//    @Bean
//    @ConfigurationProperties(prefix = "spring.datasource")
//    public DataSource dataSource() throws SQLException {
//        DruidDataSource druidDataSource = new DruidDataSource();
//        //加入监控功能，并加入了sql防火墙监控
//        druidDataSource.setFilters("stat,wall");
//        return druidDataSource;
//    }
//
//    /**
//     * 使用 RegistrationBean来注入StatViewServlet，该Servlet可以完成sql监控功能
//     * 1.new ServletRegistrationBean(statViewServlet, "/druid/*"); 表示当访问路径包括 /druid/* 时，会调用StatViewServlet
//     * @return
//     */
//    @Bean
//    public ServletRegistrationBean statViewServlet() {
//        StatViewServlet statViewServlet = new StatViewServlet();
//        ServletRegistrationBean registrationBean = new ServletRegistrationBean(statViewServlet, "/druid/*");
//        //设置 init-parameter，设置用户名、密码
//        registrationBean.addInitParameter("loginUsername", "lmy");
//        registrationBean.addInitParameter("loginPassword", "666666");
//        return registrationBean;
//    }
//
//    /**
//     * 使用 FilterRegistrationBean来注入WebStatFilter，该Filter可以完成URI监控功能
//     * @return
//     */
//    @Bean
//    public FilterRegistrationBean webStatFilter() {
//        // 创建WebStatFilter
//        WebStatFilter webStatFilter = new WebStatFilter();
//        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);
//
//        //默认对所有url请求进行监控
//        filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
//
//        //排除指定的url
//        filterRegistrationBean.addInitParameter("exclusions",
//                "*.js,*.gif,*.png,*.css,*.ico,/druid/*");
//        return filterRegistrationBean;
//    }
}
